package p05;

import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.support.GenericApplicationContext;

/**
 * 常见BeanFactory后处理
 * BeanFactory负责给BeanFactory提供扩展，使其能够解析一些注解
 *
 * @author Chen weishuai
 * @since 2025/7/23
 */
public class MyBeanFactoryPostProcessor {

    public static void main(String[] args) {
        /**
         * 原生容器无法解析@Configuration，@ComponentScan，@Bean，@Component
         * 加一个后处理器ConfigurationClassPostProcessor，来解析这些注解
         */
        GenericApplicationContext context = new GenericApplicationContext();
        context.registerBean(Config.class);
        /**
         * ConfigurationClassPostProcessor:一个强大的BeanFactory后处理，能够解析很多注解
         * 加了这个后处理器，就能解析@Configuration，@ComponentScan，@Bean
         *  ，@Component,@Import,@ImportResource
         */
        context.registerBean(ConfigurationClassPostProcessor.class);
        // MapperScannerConfigurer后处理器能够解析@Mapper，放进容器(SSM整合时常用)
        context.registerBean(MapperScannerConfigurer.class, bd -> {
            // 给bean定义增加属性
            bd.getPropertyValues().add("basePackage", "p05.mapper");
        });
        context.refresh();
        // 打印看看有几个bean
        for (String name : context.getBeanDefinitionNames()) {
            System.out.println(name);
        }
    }
}
